package com.wyw.satoken.learning.config;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.strategy.SaStrategy;
import cn.dev33.satoken.util.SaFoxUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @Title
 * @Description
 * @Author Mr Wu yewen.wu.china@gmail.com
 * @Date 2024/3/18 14:15
 * Update History:
 * Author        Time            Content
 */
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {

    /**
     * 注册拦截器
     *      仅仅作登录校验功能
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册 Sa-Token 拦截器，校验规则为 StpUtil.checkLogin() 登录校验
        registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))
                .addPathPatterns("/**")
                .excludePathPatterns("/user/doLogin")
                ;
    }

    /**
     * 注册拦截器
     *      自定义完整的lambda表达式来定翼详细的校验规则
     */
//    @Override
//    public void addInterceptors(InterceptorRegistry registry) {
//        // 注册 Sa-Token 拦截器，定义详细认证规则
//        registry.addInterceptor(new SaInterceptor(handle -> {
//            // 指定一条 match 规则
//            SaRouter
//                    .match("/**")   // 拦截的 path 列表，可以写多个 */
//                    .notMatch("/user/doLogin")  // 排除掉的 path 列表，可以写多个
//                    .check(r -> StpUtil.checkLogin())   // 要执行的校验操作，可以写完整的 lambda 表达式
//                    ;
//
//            // 根据路由划分模块，不同模块不同鉴权
//            // SaRouter.match()匹配函数有两个参数，参数1：要匹配的path路由，参数2：要执行的校验函数。
//            SaRouter.match("/user/**", r -> StpUtil.checkPermission("user"));
//            SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin"));
//            SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods"));
//            SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders"));
//            SaRouter.match("/notice/**", r -> StpUtil.checkPermission("notice"));
//            SaRouter.match("/comment/**", r -> StpUtil.checkPermission("comment"));
//
//            // 在校验函数内不只可以使用 StpUtil.checkPermission("xxx") 进行权限校验，你还可以写任意代码
//            SaRouter.match("/**", r -> System.out.println("Hello World"));
//            // 连缀写法
//            SaRouter.match("/**").check(r -> System.out.println("Hello World"));
//
//        })
////                .isAnnotation(false)// 指定关闭注解鉴权能力，这样框架就只会做路由拦截校验
//        ).addPathPatterns("/**");
//
//
//    }

    /**
     * 重写 Sa-Token 框架内部算法策略
     *  更改了 token 生成策略但是不生效？
     *      把 Redis 中的旧数据清除掉再试试
     */
    @Autowired
    public void rewriteSaStrategy() {
        // 重写 Token 生成策略
        SaStrategy.instance.createToken = (loginId, loginType) -> {
            return SaFoxUtil.getRandomString(60);    // 随机60位长度字符串
        };
    }


}
